package com;

import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import javax.validation.constraints.NotNull;

/**
 * 使用Springboot validate
 */
@RestController
@Validated
public class ValidController {

    /**
     * 基本使用@Valid。
     * 使用时注释@Validated。
     * <p>
     * 结果：校验生效，抛出异常。
     *
     * @param user
     * @return
     */
    @RequestMapping("/user")
    public String user(@Valid User user) {
        System.out.println(user);
        return "ok";
    }

    /**
     * 验证@Valid不能直接校验参数，只能校验级联属性。
     * 使用时注释类上的@Validated注解。
     * 使用postman发生请求，只传递id属性不传递值，不会抛出异常。
     * <p>
     * 结果：校验不生效。
     *
     * @param id
     * @return
     */
    @RequestMapping("/id")
    public String id(@Valid @NotNull Long id) {
        System.out.println(id);
        return "ok";
    }

    /**
     * 类上加@Validated后可以校验方法参数。在这个方法中我们为了屏蔽@Valid的影响，
     * 单独测试@Validated+@NotNull。
     * 使用时打开类上@Validated注解。
     * <p>
     * 结果：校验生效，抛出异常。
     *
     * @param id
     * @return
     */
    @RequestMapping("/id1")
    public String id1(@NotNull Long id) {
        System.out.println(id);
        return "ok";
    }

    /**
     * 注释类上的@Validated注解，我们在方法上加@Validated，
     * 发现在方法上加@Validated不生效。
     * <p>
     * 结果：校验不生效。
     *
     * @param id
     * @return
     */
    @RequestMapping("/id2")
    public String id2(@Validated @NotNull Long id) {
        System.out.println(id);
        return "ok";
    }

    /**
     * 验证@Valid不能直接校验集合。
     * 注释类上的@Validated。
     * <p>
     * 结果：校验不生效。
     *
     * @param dtos
     * @return
     */
    @RequestMapping(value = "/deploy", method = RequestMethod.POST)
    public String batchDeploy(@Valid @RequestBody AgentDeployDto[] dtos) {
        System.out.println(dtos);
        return "ok";
    }

    /**
     * 注意@Valid不能直接校验集合，需要将集合嵌套后校验。
     * 注释类上的@Validated。
     * <p>
     * 结果：校验生效，抛出异常。
     *
     * @param agentDeployDtoList
     * @return
     */
    @RequestMapping(value = "/deploy1", method = RequestMethod.POST)
    public String batchDeploy1(@Valid @RequestBody AgentDeployDtoList agentDeployDtoList) {
        System.out.println(agentDeployDtoList);
        return "ok";
    }
}
